/**
 * Created with IntelliJ IDEA.
 * Description:  数据类型和变量
 * User: 阿宾
 * Date: 2024-04-23
 * Time: 18:20
 */
public class Test01 {
    public static void main1(String[] args) {
        System.out.println("hello");
        //类比C语言的const关键字
        int a = 10;//此时的a为变量，可以进行修改
        a = 8;
        final int b = 20;
        //b = 30;//error ，类比const修饰的变量不能改变，使其成为常量
        //java中常量一般用大写表示，所以final int B = 20;
        //int c;
        //System.out.println(c);//java中没有初始化的变量不能使用

        /*
        * 长整型 8个字节
        *
        */
        long c = 10;
        System.out.println(c);
        System.out.println(Long.MAX_VALUE);
        System.out.println(Long.MIN_VALUE);
        //为了区分整型类型和长整型类型，建议将长整型变量初始值后加上L或l
        long tmp = 30l;//不建议用小写的l,因为不好区分
        long tmp1 = 30L;

        /*
        短整型变量 2个字节
         */
        short sh = 10;
        System.out.println(sh);
        System.out.println(Short.MAX_VALUE);//2^15-1
        System.out.println(Short.MIN_VALUE);//-2^15

        /*
        字节型变量 1个字节
         */
        byte b1 = 10;
        System.out.println(Byte.MAX_VALUE);
        System.out.println(Byte.MIN_VALUE);

    }

    public static void main2(String[] args) {
        /*
        双精度浮点型 8字节
         */
        double a = 2.0;
        double b = 3;
        System.out.println(b/a);
        double num = 1.1;
        System.out.println(num * num);

        /*
        单精度浮点型 4字节
         */
        float c = 12.4f;
        System.out.println(c);

    }

    public static void main3(String[] args) {
        /*
        char 2个字节
        因为Java中的char类型可以表示整数，所以一个char占用2个字节
         */
        //没有负数
        char c1 = 'A';
        char c2 = '高';

        boolean b1 = true;
        boolean b2 = false;
        //boolean b3 = 1;//error


    }

    public static void main4(String[] args) {
        String str = "hello";
        String str2 = "world";
        int a = 10;
        System.out.println(str+str2);//实现字符串的拼接
        System.out.println(str.length());//求字符串的长度
        System.out.println(str.charAt(0));//访问字符串的第一个字符


        System.out.printf("a = %d\n",a);//保留了C语言的输出格式
        System.out.println("a == "+ a + a);

        System.out.println(a+1);
        System.out.println(String.valueOf(a)+1);
        float tmp = 10;
        int tmp1 = 5;
    }

    public static void main5(String[] args) {
        System.out.println(Integer.MIN_VALUE);
        System.out.println(Integer.MAX_VALUE);
    }

    public static void main6(String[] args) {
        /*
        类型转换
         */

        long b = 20L;
        int a = 10;
        b = a;//可以将范围小的变量赋给范围大的变量，称为自动类型转换
        //a = b;//error 不可以将范围小的变量赋给范围大的变量
        a = (int)b;//称为强制类型转换

        int a2 = 10;
        boolean b1 = true;
        //a2 = (int)b1; //error,不相干的类型不能互相转换

    }

    public static void main7(String[] args) {
        int a = 10;
        long b = 20L;
        //int c = a + b;//error,a+b会发生类型提升，都变成long类型，而范围大的类型赋值给范围低的类型需要进行强制转换
        //方式1
        long c1 = a + b;
        //方式2
        int c2 = (int)(a + b);
        System.out.println(c1);//30
        System.out.println(c2);//30

        //---------------------------------
        //对于小于4个字节的变量类型，会提升到int参与运算
        byte b1 = 125;
        byte b2 = 123;
        //byte b3 = b1 + b2;//error 因为等式右边b1+b2会先变成int类型，然后相加，结果也是int，需要强制类型转换
        //方式1
        byte b3 = (byte)(b1+b2);//  强制类型转换，发生数据丢失
        //方式2
        int b4 = b1+b2;
        System.out.println(b3);//-8
        System.out.println(b4);//248




    }

    public static void main(String[] args) {
        //int转换成String类型
        int a = 100;
        //调用String这个类型的方法
        //方法1
        String s1 = String.valueOf(a);
        System.out.println(s1+1);//1001
        //方法2
        String s2 = a+"";//此时的加号是拼接的意思
        String s3 = a+"hello";
        System.out.println(s2);
        System.out.println(s3);//100hello
        //拼接顺序问题
        String s4 = 10+20+"x";
        String s5 = "x"+10+20;
        System.out.println(s4);//30x  先计算10+20，结果30，然后30+“x"，相当于字符串的拼接，为30x
        System.out.println(s5);//x1020 先计算”x"+10，是字符串的拼接，为x10，是字符串，然后+20，还是字符串拼接

        //String转int
        //方式1
        String s6 = "102";
        int ret = Integer.valueOf(s6);//转换成int类型
        System.out.println(ret+5);//107

        //方式2
        int ret2 = Integer.parseInt(s6);
        System.out.println(ret2+2);//104
    }

}
